<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        
        // 作用：专门用来解决异步编程问题，终极解决方案，用同步表达异步操作
        // async用来声明某个函数是异步函数，await用来等待异步代码执行
        async function fn(){
            console.log('开始A')
       const f1 = await new Promise((resolve,reject)=>{//***await只能等待promise实例，其他的一概不等（但是await语句后的所有都变成了异步）
        // throw new Err('报错啦') 4.如果async函数内部报错，则async函数直接返回失败的promise实例，值为错误信息
                setTimeout(()=>{
                    console.log('A成功')
                    // resolve('okokok')
                    reject('222')//如果await等待的是失败状态的promise实例，则直接退出当前的async函数，函数的其他语句不再执行
                },2000)
            })
        console.log('f1',f1)//如果await等待的是成功状态的promise实例，promise实例完成后，await返回当前成功promise实例的值
            console.log('bbbb')//await之后的语句，需要等promise实例的状态变为成功后才会继续执行
            // return 1 //1.async函数默认返回成功状态的promise，值为函数内部return的值
            return new  Promise((resolve,reject)=>{//2.如果return的是一个promise实例，则async函数返回值与这个promise实例保持一致
                resolve(555)
                // reject(666)
            })
        }
        
        console.log(fn()) //3.如果await等待的是失败状态的promise实例，则async函数的返回值与内部这个失败promise实例保持一致
        // console.log(6666)
    </script>
</body>
</html>